package com.xujiang.common_core.util.ourexception;

/**
 * @author xujiang
 * @version 2017-06-30 15:14
 */
public class SystemExceptionHelper {   //我的自定义异常帮助类

    private Throwable mThrowable;  //传入的异常对象

    public Throwable getmThrowable() {  //返回异常对象
        return mThrowable;
    }

    public void setmThrowable(Throwable mThrowable) {  //设置异常对象
        this.mThrowable = mThrowable;
    }

    /**
     * 供给外部调用的初始化函数，函数里调用的构造函数初始化
     *
     * @param throwable Throwable 类是 Java 语言中所有错误或异常的超类
     * @return 还回一个SystemExceptionHelper对象
     */
    public static SystemExceptionHelper with(Throwable throwable) {
        return new SystemExceptionHelper(throwable);
    }

    /**
     * 内部初始化，private 属性只有内部调用
     * 这 相当于构造函数
     *
     * @param throwable Throwable 类是 Java 语言中所有错误或异常的超类
     */
    private SystemExceptionHelper(Throwable throwable) {
        mThrowable = throwable;
    }

    /**
     * ？？？？？？
     * 对getCause()还需要理解
     *
     * 该类返回错误原因
     *
     * 此处使用了java1.5引入的注解机制，如有不懂请先学习java的注解我的另一个项目有demo，请在README.md文件中查询地址
     */
    public Throwable getCause() {
        if (mThrowable != null && mThrowable instanceof ISystemException) {  //检验mThrowable是否实现接口
            SystemExceptionNoVessel annotation = mThrowable.getClass()
                    .getAnnotation(SystemExceptionNoVessel.class);  //查询传入mThrowable的类是否存在SystemExceptionNoVessel注解
            if (annotation != null) {  //如果存在则返回mThrowable
                return mThrowable;
            }
            return mThrowable.getCause();  //否则返回此 throwable 的 原因；如果 cause 不存在或未知，则返回 null。用于使用实现ISystemException结构的异常去初始化另一个异常时调用
        }
        return mThrowable;  //返回mThrowable
    }

    /**
     * 从注解得到异常原因如果为空，则通过传入参数获取异常
     *
     * @param me 异常参数
     */
    @SuppressWarnings("ThrowableResultOfMethodCallIgnored")  //忽略警告
    public String throwableToString(Throwable me) {
        Throwable cause = getCause();  //得到异常原因
        if (cause == null) {
            cause = me;
        }
        String msg = cause.toString();    //原因string化
        String name = cause.getClass().getName();  //得到异常原因的类
        if (msg == null) {
            return name;
        }
        return name + ": " + msg;
    }

}
